package com.ggkt.common.utils;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * @author ggkt
 */
public class Randcodes {

    private String code;

    private BufferedImage image;

    public Randcodes(String code, BufferedImage image) {
        super();
        this.code = code;
        this.image = image;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        this.image = image;
    }

    /**
     * 给定范围获得随机颜色
     */
    private static Color getRandColor(int fc, int bc) {
        Random random = new Random();
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

    @SuppressWarnings("unused")
    public static Randcodes createCodeImage() {
        // 在内存中创建图象
        int width = 56, height = 20;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        int sRand = 0;
        try {
            // 获取图形上下文
            Graphics g = image.getGraphics();

            // 生成随机类
            Random random = new Random();

            // 设定背景色
            // g.setColor(getRandColor(200,250));
            g.fillRect(0, 0, width, height);

            // 设定字体
            g.setFont(new Font("Times New Roman", Font.PLAIN, 25));
            g.setFont(new Font("Times New Roman", Font.BOLD, 25));

            // 画边框
            // g.setColor(new Color(55,55,55));
            // g.drawRect(0,0,width-1,height-1);

            // 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到
            g.setColor(getRandColor(50, 100));
            for (int i = 0; i < 3; i++) {
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(12);
                int yl = random.nextInt(12);
                g.drawLine(0, y, 60, y + yl);
            }

            g.setColor(getRandColor(160, 200));
            for (int i = 0; i < 55; i++) {
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(12);
                int yl = random.nextInt(12);
                g.drawLine(x, y, x + xl, y + yl);
            }

            // 取随机产生的认证码(2位数字 做随机+-*运算)
            String[] operators = new String[]{"+", "-", "*"};
            String operator = operators[random.nextInt(3)];
            int randa = random.nextInt(9);
            int randb = random.nextInt(9);
            randa += 1;
            randb += 1;

            if (operator.equals("+")) {
                sRand = randa + randb;
            } else if (operator.equals("-")) {
                if (randa < randb) {
                    int a = randa;
                    randa = randb;
                    randb = a;
                }
                sRand = randa - randb;
            } else {
                sRand = randa * randb;
            }
            // 将认证码显示到图象中
            g.setColor(new Color(20 + random.nextInt(10), 20 + random.nextInt(110), 20 + random.nextInt(210)));
            // 调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成
            g.drawString(randa + "", 13 * 0 + 3, 16);
            g.drawString(operator, 13 * 1 + 3, 16);
            g.drawString(randb + "", 13 * 2 + 3, 16);
            g.drawString("=", 13 * 3 + 3, 16);

            // 图象生效
            g.dispose();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return new Randcodes(sRand + "", image);
    }

}
